\section{Desarrollo}

\subsection{Marco teórico}
   Una \textbf{imagen digital} es una representación bidimencional de una imagen en la computadora.
   Se compone de una matriz de \textbf{pixeles}, que son la menor unidad de la imagen y representan un color. 
   Por cada pixel utilizamos 24 bits para representar la intencidad de los canales rojo, verde y azul (RGB)
   y con esto poder representar practicamente cualquier color perseptible. 
   Siguiendo este esquema, cada canal tiene 8 bits, con lo cual su rango de representación estará acotado
   entre 0 y 255.
   
   Teniendo como fin la creación de fotomosaico, partimos de una imagen principal,
   la cual se llevará por medio de procesamientos a la imagen final, que es el fotomosaico en cuestión. Para esto, 
   contamos con una base de muchas fotos y aplicaremos una serie de procedimientos 
   para lograr el efecto deseado. Para esto notaremos como \textbf{cuadrante} a una división de imagen principal,
   a la cual dividimos en varios cuadrantes de alto y ancho fijos e iguales entre sí.
   Los pasos generales a seguir son:
   \begin{itemize}
      \item Regenerar la base, achicando cada imagen al alto y ancho de los cuadrantes.
      \item Dividir la imagen principal en cuadrantes de alto y ancho fijo e iguales.
      \item Por cada cuadrante se debe
         \begin{itemize}
            \item Buscar dentro de la base regenerada, la imagen que mas se aproxime al cuadrante actual.
            \item Reemplazar el cuadrante por la imagen encontrada.
         \end{itemize}
   \end{itemize}
   
   \begin{figure}[h]
      \centering
      \includegraphics[width=0.8\textwidth]{imgs/proceso.png}
      \caption{Idea principal para la creación de fotomosaicos.}
   \end{figure}
   
   \begin{figure}[h]
      \centering
      \includegraphics[width=0.8\textwidth]{imgs/proceso2.png}
      \caption{El procesamiento más en detalle por cada cuadrante de la imagen principal.}
   \end{figure}
   
   Para ver cual es la imagen que más se aproxima al cuadrante actual, se pueden utilizar varios métodos
   los cuales se diferencian por su  performance y su velocidad. 
   A continuación se mencionan los más importantes y cual elegimos en este caso.
   
   El método más fácil y directo para comparar una imagen y un cuadrante, es comparar cada pixel de la imagen
   de la base comparada, con el pixel en su correspondiente posición relativa en el cuadrante actual
   y luego acumlar la distancia entre cada pareja de pixeles para obtener una distancia general.
   
   Esto se puede hacer utilizando el \textit{método lineal} que conciste en hacer para cada pixel 
   $D = \Delta R + \Delta G + \Delta B$ siendo $\Delta X$ la diferencia entre el canal X de ambas imagenes.
   
   Otra alternativa que da mejores resultados es utilizar el \textit{método cuadrático} que es como el lineal pero para
   cada pareja de pixeles nos da su distancia euclediana. Esto se logra haciendo, $D = \sqrt{\Delta R^2 + \Delta G^2 + \Delta B^2}$, 
   y nos da una distancia mucho mas precisa que la lineal.
   
   De cualquier manera, si bien comparar imagenes de esta manera de un buen resultado, la cantidad de calculos a realizar es
   muy grandes, aún haciendolo en ASM se realiza en forma muy lenta. 
   Para cada cuadrante, para cada imagen de la base se debe calcular la distancia pixel a pixel y 
   para eso se debe comparar cada uno de los canales RGB. Por esto si bien el método puede servir, cuando la 
   base cuenta con una gran cantidad de imagenes el método pasa a ser inutil a la hora para correrlo, luego queda descartado.
   
   Un método interesante para poder comparar las imagenes, que en la practica no pierde mucha precisión y se
   gana mucha velocidad es utilizando el color promedio. Durante el proceso de achicamiento de las imagenes,
   se puede calcular, una vez achicada la imagen, el color promedio de la misma. Esto es sumar cada pixel y dividirlo
   por la cantidad de pixeles en la imagen, lo que genera un pixel promedio para cada imagen. Luego para comparar un 
   cuadrante basta con ver cual es la imagen que tiene la menor distancia (por ejemplo euclediana) con el valor promedio
   del cuadrante. Este método es mucho mas rápido, ya que si tenemos guardado el valor del pixel promedio de cada imagen,
   la comparación se puede hacer lineal en la cantidad de fotos de la base de imagenes.
   
   Para poder llevar a cabo el concepto de video mosaico, lo que se hace es ir procesando el video 
   como si fuera una secuencia de varias imagenes, luego simplemente es ir procesando imagen a imagen,
   por lo cual la idea de hacer el proceso en forma rápida es fundamental para poder lograr procesar el video
   en tiempos coherentes.
   
\subsection{Algoritmo}
   La idea general del algoritmo para la generación de fotomosaicos se explica en el \textit{Algoritmo 1}, 
   notamos como C(x,y) al cuadrante (x,y) de la imagen original.
   \begin{algorithm}
      \caption{Creación de fotomosaicos}
      \begin{algorithmic}[1]
         \STATE $cols \leftarrow cuadrantes\_horizontales$
         \STATE $rows \leftarrow cuadrantes\_verticales$
         \FOR{$x$ in $[0..cols)$}
            \FOR{$y$ in $[0..rows)$}
               \STATE $distanciaMinima \leftarrow \infty $
               \STATE $imagenReemplazar \leftarrow null $
               \FOR{$image$ in $base$}
                  \STATE $dist \leftarrow diferencia(Cuadrante(x,y), imagen)$
                  \IF{$dist < distanciaMinima$}
                     \STATE $distanciaMinima \leftarrow dist$
                     \STATE $imagenReemplazar \leftarrow imagen$
                  \ENDIF
               \ENDFOR
               \STATE $reemplazar(C(x,y), imagenReemplzar)$
            \ENDFOR
         \ENDFOR
      \end{algorithmic}
   \end{algorithm}
   
   La idea de optimización en ASM es hacerlo con las funciones que mas pueden tardar y que
   a la vez son paralelizables. Es por esto que se realizará la optimización de las funciones
   \textit{obtenerPromedio}, \textit{diferencia}, \textit{mejorImagen}. 
   
   También se deberá realizar el proceso de generación de la base de datos, que consta de achicar
   cada imagen y obtener su proceso. Este paso también se relizará con funcinoes de ASM.
   
\subsection{Implementación}
   Para la implementación de este proceso utilizaremos C y ASM con las extenciones SSE y la
   libreria OpenCV para la manipulación de imágenes en C. La idea es recibir una imagen a tranformar
   y una carpeta donde se encuentran alojadas las fotos. Como el proceso de generar la base de datos
   puede tardar conciedrablemente, según la cantidad de fotos que la base contenga, se podrá generar
   un archivo que contega el nombre de la foto y su color promedio, luego en vez de pasar
   un directorio, se pasará el archivo generado.
   
   Habra tres programas que sirven para generar fotomosaicos, videomosaicos, o videomosaicos en vivo, 
   todos utilizan las mismas funciones de ASM, que estaran divididas en distintos archivos.


